/*
 * ComponenteDistribuidorIntegrador.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 2/03/2011, 05:33:18 PM
 */
package com.ufps.cuatro.modelo.representacion.componente;

import com.ufps.cuatro.modelo.old.ComponenteBeans;
import com.ufps.cuatro.modelo.representacion.PropiedadBeans;
import com.ufps.cuatro.util.Utileria;
import com.ufps.cuatro.util.base.ComponenteBaseStandar;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * <i><b>ComponenteDistribuidorIntegrador:</b></i><p>Representa un Objeto del Módelo Analizado
 * que será representado en una Contenedor de Interfaz gráfica.</p>
 * <p>A diferencia de los <code>ComponenteGenerador</code> la existencia de un
 * <code>ComponenteDistribuidorIntegrador</code> no la determinan los tipos de datos del Modelo
 * Analizado sino el criterio del usuario de acuerdo a los requerimientos para
 * la representación de su GUI. Por lo tanto un <code>ComponenteDistribuidorIntegrador</code>
 * necesita un <code>ObjetoReflexion</code> para su creación.</p>
 * <p>Nota: Este tipo de objetos no supone un analisis extra, simplemente es un
 * contenedor que utiliza los objetos de las fases anteriores.</p>
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 2/03/2011
 * @see ComponenteDistribuidor 
 */
public abstract class ComponenteDistribuidorIntegrador extends ComponenteDistribuidor{
    private static final long serialVersionUID = -7705466584842753064L;
    
    private int idClaseComponenteIntegrador;
    /**
     * Serie Númerica para la generación de id de Objetos.
     */
    public static int serialIdComponenteIntegrador;     
    protected ArrayList<ComponenteDistribuidor> objComponentesDistribuidores;   

    /**
     * 
     * @param objComponenteBase {#Componente}     
     * @param heredado
     * @param previsualizar
     */
    public ComponenteDistribuidorIntegrador(ComponenteBaseStandar objComponenteBase, boolean heredado, boolean previsualizar) {
        super(objComponenteBase, heredado, previsualizar);        
        this.objComponentesDistribuidores = new ArrayList<ComponenteDistribuidor>();
        this.objComponentesGenerados = new ArrayList<ComponenteGeneradoSimple>();
        this.heredado = heredado;
        this.previsualizar = previsualizar;
	this.dni = Utileria.leerRecursoTexto("Utileria.dni.componente.distribuidor.integrador");   
        if(!heredado) {
            this.idClaseComponenteIntegrador = (!previsualizar) ?
                    ComponenteDistribuidorIntegrador.serialIdComponenteIntegrador++ :
                    ComponenteDistribuidorIntegrador.serialIdComponenteIntegrador;
        }        
    }     

    /**
     * 
     * @return
     */
    public int getIdClaseComponenteIntegrador() {
        return idClaseComponenteIntegrador;
    }

    /**
     * 
     * @param idClaseComponenteGeneradorClase
     */
    public void setIdClaseComponenteIntegrador(int idClaseComponenteGeneradorClase) {
        this.idClaseComponenteIntegrador = idClaseComponenteGeneradorClase;
    }
    
    /**
     * Devuelve la Referencia a la Colección de <code>ComponenteExtra</code> Incluidos.
     * @return Referencia a la Colección de <code>ComponenteExtra</code> Incluidos.
     */
    public ArrayList<ComponenteDistribuidor> getObjComponentesDistribuidores() {
        return objComponentesDistribuidores;
    }

    /**
     * Establece la Referencia a la Colección de <code>ComponenteExtra</code> Incluidos.
     * @param objComponentesDistribuidores Referencia a la Colección de <code>ComponenteExtra</code> Incluidos.
     */
    public void setObjComponentesDistribuidores(ArrayList<ComponenteDistribuidor> objComponentesDistribuidores) {
        this.objComponentesDistribuidores = objComponentesDistribuidores;
    }
    
    /**
     * Elimina el Componente en la Posición i.
     * @param i Posición del Componente.
     * @return Componente Eliminado.
     */
    public ComponenteDistribuidor del(int i){
        return this.objComponentesDistribuidores.remove(i);
    }
    
    public int sizeWidth(){        
        int size = 0;        
        for(ComponenteDistribuidor objComponente : this.objComponentesDistribuidores){
            size += objComponente.getObjPlantillaComponenteDistribucionIndividualSeleccionada().getObjGridBagConstraints().gridwidth;
        }
        return size + this.getObjPlantillaComponenteDistribucionIndividualSeleccionada().getObjGridBagConstraints().gridwidth;        
    }
    
    public int sizeHeight(){        
        int size = 0;
        for(ComponenteDistribuidor objComponente : this.objComponentesDistribuidores){
            size += objComponente.getObjPlantillaComponenteDistribucionIndividualSeleccionada().getObjGridBagConstraints().gridheight;
        }
        return size + this.getObjPlantillaComponenteDistribucionIndividualSeleccionada().getObjGridBagConstraints().gridheight;        
    }  
    
    /**
     * Agrega una Colección al final del Contenedor Generico de Componentes.
     * @param objComponentes Colección
     */
    public void addAll(ArrayList<ComponenteDistribuidor> objComponentes){
        this.objComponentesDistribuidores.addAll(objComponentes);
    }
    
    /**
     * Agrega un Componente a la Colección.
     * @param objComponente Componente.
     */
    public void addComponente(ComponenteDistribuidor objComponente){
        this.objComponentesDistribuidores.add(objComponente);
    }
    
    /**
     * Actualiza el Componente en la Posición i.
     * @param i Posición del Componente.
     * @param objComponente Componente.
     */
    public void set(int i, ComponenteDistribuidor objComponente){
        this.objComponentesDistribuidores.set(i, objComponente);
    }
    
    /**
     * Elimina el Componente i.
     * @param i Componente.
     * @return boolean que indica el resultado del Proceso.
     */
    public boolean del(ComponenteDistribuidor i){
        return this.objComponentesDistribuidores.remove(i);
    }
    
    public boolean ubicarComponentesEnTablaDistribucion(){        
        try{
            Distribuidor objDistribuidorSeleccionado = this.getObjDistribuidorGrupalSeleccionado();
            return objDistribuidorSeleccionado.generarTablaDistribucion();
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorClaseCompleja.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }
    
    public Componente buscarComponente(String strName){
        try{
            strName = Utileria.formatStringSinHTML(strName);
            Componente objComponente;            
            //Primero se Busca en la Colección de Componentes Incluidos
            objComponente = this.buscarComponenteEnDistribucion(strName);
            if(objComponente != null){
                return objComponente;
            }
            //Luego busco en los Componentes Generados
            objComponente = this.getObjComponenteIncluido(strName);
            if(objComponente != null){
                return objComponente;
            }
            objComponente = this.buscarComponenteGenerado(strName);
            if(objComponente != null){
                return objComponente;
            }
        }catch(java.lang.NullPointerException ex){            
        }
        return null;
    }    
    
    @Override
    public Componente getObjComponenteIncluido(String strName) {
        for(Componente objComponente : this.objComponentesDistribuidores){
            String strPropertiesName = objComponente.getName();
            if(strName.equals(strPropertiesName)){
                return objComponente;
            }                
        }
        for(Componente objComponente : this.objComponentesGenerados){
            String strPropertiesName = objComponente.getName();
            if(strName.equals(strPropertiesName)){
                return objComponente;
            }                
        }
        return null;
    }    
    
    public ComponenteBeans generarRepresentacionBeans() {
        ComponenteBeans objTempComponenteBeans = new ComponenteBeans(this);
        for(ComponenteDistribuidor objComponenteDistribuidor : this.objComponentesDistribuidores){
            if(objComponenteDistribuidor instanceof ComponenteDistribuidorIntegradorMetodo){
                ComponenteBeans objTempDistribuidorComponenteBeans = objComponenteDistribuidor.getObjComponenteBeans();
                objTempComponenteBeans.add(objTempDistribuidorComponenteBeans);                        
            }
            else if(objComponenteDistribuidor instanceof ComponenteDistribuidorIntegradorExtra){
                ComponenteBeans objTempDistribuidorComponenteBeans = objComponenteDistribuidor.getObjComponenteBeans();
                objTempComponenteBeans.add(objTempDistribuidorComponenteBeans);                        
            }
            else if(objComponenteDistribuidor instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                ComponenteBeans objTempDistribuidorComponenteBeans = objComponenteDistribuidor.getObjComponenteBeans();
                objTempComponenteBeans.add(objTempDistribuidorComponenteBeans);                        
            }
            else if(objComponenteDistribuidor instanceof ComponenteDistribuidorGeneradorUnitario){
                ComponenteDistribuidorGeneradorUnitario objComponenteDistribuidorGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) objComponenteDistribuidor;
                PropiedadBeans objPropiedadBeans = objComponenteDistribuidorGeneradorUnitario.getObjComponenteGenerador().getObjPropiedadBeans();
                objTempComponenteBeans.add(objPropiedadBeans);   
            }
            else if(objComponenteDistribuidor instanceof ComponenteDistribuidorGeneradorString){
                ComponenteDistribuidorGeneradorString objComponenteDistribuidorGeneradorString = (ComponenteDistribuidorGeneradorString) objComponenteDistribuidor;
                PropiedadBeans objPropiedadBeans = objComponenteDistribuidorGeneradorString.getObjComponenteGenerador().getObjPropiedadBeans();
                objTempComponenteBeans.add(objPropiedadBeans);   
            }
            else if(objComponenteDistribuidor instanceof ComponenteDistribuidorExtra){
                ComponenteDistribuidorExtra objComponenteDistribuidorExtra = (ComponenteDistribuidorExtra) objComponenteDistribuidor;
                PropiedadBeans objPropiedadBeans = objComponenteDistribuidorExtra.getObjComponenteGenerador().getObjPropiedadBeans();
                objTempComponenteBeans.add(objPropiedadBeans);   
            }            
        }
        return objTempComponenteBeans;
    }
}